package com.youi.third.ali.oss;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.StorageClass;
import com.youi.util.DateUtil;
import com.youi.util.ObjectUtil;
import com.youi.util.SmsUtil;

/**
 * oss上传工具
 * @author erdong.Chan
 *
 */
public class OSSUtil {

	// Endpoint以杭州为例，其它Region请按实际情况填写。
	private final static String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";
	// 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
	private final static String accessKeyId = "LTAI4FqtFgjxP11kmdD3t9xr";
	private final static String accessKeySecret = "PzYfCaOUWdtBWDmu1gy57Ui7ya0zHe";
	private final static String bucketName = "myjjk-image";
	
	private final static SimpleDateFormat simpyMd=new SimpleDateFormat("yyyyMMdd");
	
	private final static SimpleDateFormat simpHms=new SimpleDateFormat("HHmmss");
	
	/**
	 * 上传工具
	 * @param fileArr 文件二进制数组
	 * @param fileType 文件类型
	 * @return
	 */
	public static String upload(byte [] fileArr,String fileType){
		// 创建文件名
		String objectName = createdObjectName(fileType);
		// 创建OSSClient实例。
		OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);
		
		// 上传内容到指定的存储空间（bucketName）并保存为指定的文件名称（objectName）。
		
		PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,objectName, new ByteArrayInputStream(fileArr));

		// 如果需要上传时设置存储类型与访问权限，请参考以下示例代码。
		ObjectMetadata metadata = new ObjectMetadata();
		metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
		metadata.setObjectAcl(CannedAccessControlList.PublicReadWrite);
		putObjectRequest.setMetadata(metadata);
		ossClient.putObject(putObjectRequest);
		ossClient.shutdown();
		return "https://image.myjjk.com.cn"+"/"+objectName;
	}
	
	public static String deleteUpload(String objectName) {
		// 创建OSSClient实例。
		OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
		// 删除文件。如需删除文件夹，请将ObjectName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有object删除后才能删除该文件夹。
		ossClient.deleteObject(bucketName, objectName);
		// 关闭OSSClient。
		ossClient.shutdown();
		return "SUCCESS";		
	}
	
	public static boolean existObject(String objectName) {
		// 创建OSSClient实例。
		OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
		// 删除文件。如需删除文件夹，请将ObjectName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有object删除后才能删除该文件夹。
		boolean found = ossClient.doesObjectExist(bucketName, objectName);		
		// 关闭OSSClient。
		ossClient.shutdown();
		return found;		
	}
	
	
	
	/**
	 * 创建文件名
	 * @param fileType
	 * @return
	 */
	private static String createdObjectName(String fileType){
		//当前时间
		Date nowdate=new Date();
		return "myj/miniapp/img/"+simpyMd.format(nowdate)+"/"+simpHms.format(nowdate)+SmsUtil.getRandom(3)+fileType;
	}
	
	
	//本地文件转数组
	public static byte[] InputStream2ByteArray(String filePath) throws IOException {
	    InputStream in = new FileInputStream(filePath);
	    byte[] data = toByteArray(in);
	    in.close();
	    return data;
	}
	 
	private static byte[] toByteArray(InputStream in) throws IOException {
	    ByteArrayOutputStream out = new ByteArrayOutputStream();
	    byte[] buffer = new byte[1024 * 4];
	    int n = 0;
	    while ((n = in.read(buffer)) != -1) {
	        out.write(buffer, 0, n);
	    }
	    return out.toByteArray();
	}
	
	public static void main(String[] args) {
		System.out.println(existObject("myj/miniapp/img/20200226/174406357.xls"));
	}
}
